package com.nd.android.musicboxlibrary.util;

/**
 * 
 * <br>
 * Created 2014年7月17日 上午1:25:01
 * 
 * @version
 * @author wat.ztag
 * 
 * @see
 */
public final class StringMatcher {

    /**
     * Creates a new instance of StringMatcher. <br>
     * Created 2014年9月11日 下午11:15:51
     */
    private StringMatcher() {
    }

    private final static char KOREAN_UNICODE_START = '가';
    private final static char KOREAN_UNICODE_END = '힣';
    private final static char KOREAN_UNIT = '까' - '가';
    private final static char[] KOREAN_INITIAL = { 'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ',
            'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ' };

    /**
     * 
     * <br>
     * Created 2014年9月11日 下午11:15:56
     * 
     * @param value
     * value
     * @param keyword
     * keyword
     * @return boolean
     * @author wat.ztag
     */
    public static boolean match(String value, String keyword) {
        if (value == null || keyword == null) {
            return false;
        }
        if (keyword.length() > value.length()) {
            return false;
        }

        int i = 0, j = 0;
        do {
            if (isKorean(value.charAt(i)) && isInitialSound(keyword.charAt(j))) {
                if (keyword.charAt(j) == getInitialSound(value.charAt(i))) {
                    i++;
                    j++;
                } else if (j > 0) {
                    break;
                } else {
                    i++;
                }
            } else {
                if (keyword.charAt(j) == value.charAt(i)) {
                    i++;
                    j++;
                } else if (j > 0) {
                    break;
                } else {
                    i++;
                }
            }
        } while (i < value.length() && j < keyword.length());

        return (j == keyword.length()) ? true : false;
    }

    /**
     * 
     * <br>
     * Created 2014年9月11日 下午11:16:02
     * 
     * @param c
     * char型
     * @return boolean
     * @author wat.ztag
     */
    private static boolean isKorean(char c) {
        if (c >= KOREAN_UNICODE_START && c <= KOREAN_UNICODE_END) {
            return true;
        }
        return false;
    }

    /**
     * 
     * <br>
     * Created 2014年9月11日 下午11:16:09
     * 
     * @param c char
     * @return boolean
     * @author wat.ztag
     */
    private static boolean isInitialSound(char c) {
        for (char i : KOREAN_INITIAL) {
            if (c == i) {
                return true;
            }
        }
        return false;
    }

    /**
     * 
     * <br>
     * Created 2014年9月11日 下午11:16:14
     * 
     * @param c
     * char
     * @return char
     * @author wat.ztag
     */
    private static char getInitialSound(char c) {
        return KOREAN_INITIAL[(c - KOREAN_UNICODE_START) / KOREAN_UNIT];
    }
}
